home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / interpreter / ClassInfoCompiler.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-14  |  8.0 KB  |  227 lines

  1. package koala.dynamicjava.interpreter;
  2.  
  3. import java.lang.reflect.Modifier;
  4. import java.util.Iterator;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import java.util.ListIterator;
  8. import koala.dynamicjava.classfile.InnerClassesEntry;
  9. import koala.dynamicjava.classinfo.ClassInfo;
  10. import koala.dynamicjava.classinfo.ConstructorInfo;
  11. import koala.dynamicjava.classinfo.TreeClassInfo;
  12. import koala.dynamicjava.classinfo.TreeConstructorInfo;
  13. import koala.dynamicjava.interpreter.error.ExecutionError;
  14. import koala.dynamicjava.tree.BlockStatement;
  15. import koala.dynamicjava.tree.ConstructorDeclaration;
  16. import koala.dynamicjava.tree.ConstructorInvocation;
  17. import koala.dynamicjava.tree.MethodDeclaration;
  18. import koala.dynamicjava.tree.Node;
  19. import koala.dynamicjava.tree.TypeDeclaration;
  20. import koala.dynamicjava.tree.VoidType;
  21. import koala.dynamicjava.util.ImportationManager;
  22.  
  23. public class ClassInfoCompiler {
  24.    protected TreeClassInfo classInfo;
  25.    protected TypeDeclaration typeDeclaration;
  26.    protected ClassFactory classFactory;
  27.    protected TreeClassFinder classFinder;
  28.    protected TreeInterpreter interpreter;
  29.    protected boolean isInterface;
  30.    protected boolean hasAbstractMethod;
  31.    protected List classInitializer = new LinkedList();
  32.    protected List instanceInitializer = new LinkedList();
  33.    protected MembersVisitor membersVisitor;
  34.    protected ImportationManager importationManager;
  35.    // $FF: synthetic field
  36.    private static Class class$Ljava$lang$Object;
  37.    // $FF: synthetic field
  38.    private static Class class$Ljava$lang$String;
  39.  
  40.    public Class compile() {
  41.       ClassInfo var1 = this.classInfo.getDeclaringClass();
  42.       if (var1 != null) {
  43.          var1.getName();
  44.       } else {
  45.          Object var10000 = null;
  46.       }
  47.  
  48.       int var3 = this.typeDeclaration.getAccessFlags();
  49.       String var4 = this.classInfo.getName();
  50.       if (this.isInterface) {
  51.          var3 |= 512;
  52.       }
  53.  
  54.       this.classFactory = new ClassFactory(var3, var4, this.classInfo.getSuperclass().getName(), this.interpreter.getClass(), this.interpreter.getExceptionClass(), this.interpreter.getClassLoader().toString());
  55.       if (var1 != null) {
  56.          this.addInnerClassesAttribute(this.classInfo);
  57.       }
  58.  
  59.       ClassInfo[] var5 = this.classInfo.getDeclaredClasses();
  60.  
  61.       for(int var6 = 0; var6 < var5.length; ++var6) {
  62.          String var7 = var5[var6].getName();
  63.          InnerClassesEntry var8 = this.classFactory.addInnerClassesEntry();
  64.          var8.setInnerClassInfo(var7);
  65.          var8.setOuterClassInfo(var4);
  66.          var8.setInnerName(var7.substring(var4.length() + 1, var7.length()));
  67.          var8.setInnerClassAccessFlags((short)var5[var6].getModifiers());
  68.       }
  69.  
  70.       ClassInfo[] var10 = this.classInfo.getInterfaces();
  71.  
  72.       for(int var11 = 0; var11 < var10.length; ++var11) {
  73.          this.classFactory.addInterface(var10[var11].getName());
  74.       }
  75.  
  76.       Iterator var12 = this.typeDeclaration.getMembers().iterator();
  77.  
  78.       while(var12.hasNext()) {
  79.          ((Node)var12.next()).acceptVisitor(this.membersVisitor);
  80.       }
  81.  
  82.       if (!this.isInterface && this.hasAbstractMethod && !Modifier.isAbstract(var3)) {
  83.          this.typeDeclaration.setProperty("errorStrings", new String[]{var4});
  84.          throw new ExecutionError("misplaced.abstract", this.typeDeclaration);
  85.       } else {
  86.          if (!this.isInterface) {
  87.             ConstructorInfo[] var13 = this.classInfo.getConstructors();
  88.  
  89.             for(int var9 = 0; var9 < var13.length; ++var9) {
  90.                this.addConstructor((TreeConstructorInfo)var13[var9]);
  91.             }
  92.          }
  93.  
  94.          if (this.classInitializer.size() > 0) {
  95.             this.interpreter.registerMethod(this.classFactory.createClassInitializer(), new MethodDeclaration(1, new VoidType(), "<clinit>", new LinkedList(), new LinkedList(), new BlockStatement(this.classInitializer)), this.importationManager);
  96.          }
  97.  
  98.          TreeClassLoader var14 = (TreeClassLoader)this.interpreter.getClassLoader();
  99.          return var14.defineClass(var4, this.classFactory.getByteCode());
  100.       }
  101.    }
  102.  
  103.    protected void addConstructor(TreeConstructorInfo var1) {
  104.       ClassInfo[] var2 = var1.getParameterTypes();
  105.       String[] var3 = new String[var2.length];
  106.  
  107.       for(int var4 = 0; var4 < var2.length; ++var4) {
  108.          var3[var4] = var2[var4].getName();
  109.       }
  110.  
  111.       var2 = var1.getExceptionTypes();
  112.       String[] var13 = new String[var2.length];
  113.  
  114.       for(int var5 = 0; var5 < var2.length; ++var5) {
  115.          var13[var5] = var2[var5].getName();
  116.       }
  117.  
  118.       String var14 = ClassFactory.getMethodIdentifier(this.classInfo.getName(), "<init>", var3, this.interpreter.getClassLoader().toString());
  119.       ConstructorDeclaration var6 = var1.getConstructorDeclaration();
  120.       if (!var6.getName().equals(this.typeDeclaration.getName())) {
  121.          var6.setProperty("errorStrings", new String[]{var6.getName()});
  122.          throw new ExecutionError("constructor.name", var6);
  123.       } else {
  124.          ConstructorInvocation var7 = var6.getConstructorInvocation();
  125.          ConstructorVisitor var10000 = new ConstructorVisitor;
  126.          if (this == null) {
  127.             throw null;
  128.          } else {
  129.             var10000.<init>(this);
  130.             ConstructorVisitor var8 = var10000;
  131.             if (var7 != null) {
  132.                Iterator var9 = var6.getParameters().iterator();
  133.  
  134.                while(var9.hasNext()) {
  135.                   ((Node)var9.next()).acceptVisitor(var8);
  136.                }
  137.  
  138.                var7.acceptVisitor(var8);
  139.                this.interpreter.registerConstructorArguments(var14, var6.getParameters(), var7.getArguments(), this.importationManager);
  140.             } else {
  141.                this.interpreter.registerConstructorArguments(var14, new LinkedList(), new LinkedList(), this.importationManager);
  142.             }
  143.  
  144.             MethodDeclaration var15 = new MethodDeclaration(var6.getAccessFlags(), new VoidType(), "<init>", var6.getParameters(), new LinkedList(), new BlockStatement(var6.getStatements()));
  145.             this.interpreter.registerMethod(var14, var15, this.importationManager);
  146.             if (!var8.superConstructor.equals(this.classInfo.getName())) {
  147.                ListIterator var10 = var6.getStatements().listIterator();
  148.                Iterator var11 = this.instanceInitializer.iterator();
  149.  
  150.                while(var11.hasNext()) {
  151.                   var10.add(var11.next());
  152.                }
  153.             }
  154.  
  155.             this.classFactory.addConstructor(var6.getAccessFlags(), var3, var13, var8.superConstructor, var8.constructorParameters);
  156.          }
  157.       }
  158.    }
  159.  
  160.    protected void addInnerClassesAttribute(ClassInfo var1) {
  161.       for(ClassInfo var2 = var1.getDeclaringClass(); var2 != null; var2 = var2.getDeclaringClass()) {
  162.          String var3 = var1.getName();
  163.          String var4 = var2.getName();
  164.          InnerClassesEntry var5 = this.classFactory.addInnerClassesEntry();
  165.          var5.setInnerClassInfo(var3);
  166.          var5.setOuterClassInfo(var4);
  167.          var5.setInnerName(var3.substring(var4.length() + 1, var3.length()));
  168.          var5.setInnerClassAccessFlags((short)var1.getModifiers());
  169.          var1 = var2;
  170.       }
  171.  
  172.    }
  173.  
  174.    protected void addToClassInitializer(Node var1) {
  175.       this.classInitializer.add(var1);
  176.    }
  177.  
  178.    protected void addToInstanceInitializer(Node var1) {
  179.       this.instanceInitializer.add(var1);
  180.    }
  181.  
  182.    // $FF: synthetic method
  183.    static void access$0(Class var0) {
  184.       class$Ljava$lang$Object = var0;
  185.    }
  186.  
  187.    // $FF: synthetic method
  188.    static Class access$1() {
  189.       return class$Ljava$lang$Object;
  190.    }
  191.  
  192.    // $FF: synthetic method
  193.    static void access$2(Class var0) {
  194.       class$Ljava$lang$String = var0;
  195.    }
  196.  
  197.    // $FF: synthetic method
  198.    static Class access$3() {
  199.       return class$Ljava$lang$String;
  200.    }
  201.  
  202.    // $FF: synthetic method
  203.    static Class class$(String var0) {
  204.       try {
  205.          return Class.forName(var0);
  206.       } catch (ClassNotFoundException var2) {
  207.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  208.       }
  209.    }
  210.  
  211.    public ClassInfoCompiler(ClassInfo var1) {
  212.       MembersVisitor var10001 = new MembersVisitor;
  213.       if (this == null) {
  214.          throw null;
  215.       } else {
  216.          var10001.<init>(this);
  217.          this.membersVisitor = var10001;
  218.          this.classInfo = (TreeClassInfo)var1;
  219.          this.typeDeclaration = this.classInfo.getTypeDeclaration();
  220.          this.classFinder = (TreeClassFinder)this.classInfo.getClassFinder();
  221.          this.importationManager = var1.getDeclaringClass() != null ? this.classFinder.getImportationManager() : (ImportationManager)this.classFinder.getImportationManager().clone();
  222.          this.interpreter = (TreeInterpreter)this.classFinder.getInterpreter();
  223.          this.isInterface = this.classInfo.isInterface();
  224.       }
  225.    }
  226. }
  227.